package mains.Tests;

import java.util.ArrayList;

import cartes.Carte;
import cartes.CouleurCarte;
import cartes.Denomination;
import java.util.Iterator;
import mains.Main;
import junit.framework.TestCase;
import mains.RangPoker;

public class MainTest extends TestCase {

	public MainTest(String name) {
		super(name);
	}

	protected void setUp() throws Exception {
		super.setUp();
	}

	public void testMain() {
		
	}

	public void testAdd() {
		Main m1 = new Main();
		Carte c = new Carte(Denomination.CINQ, CouleurCarte.COEUR);
		m1.add(c);

		assertEquals(c, m1.first());
	}

	public void testCompareTo() {
		Main carteSuperieur = new Main();
		carteSuperieur.add(new Carte(Denomination.DAME, CouleurCarte.COEUR));
		carteSuperieur.add(new Carte(Denomination.NEUF, CouleurCarte.CARREAU));
		carteSuperieur.add(new Carte(Denomination.ROI, CouleurCarte.PIQUE));
		carteSuperieur.add(new Carte(Denomination.QUATRE, CouleurCarte.TREFLE));
		carteSuperieur.add(new Carte(Denomination.DEUX, CouleurCarte.CARREAU));

		Main paire = new Main();
		paire.add(new Carte(Denomination.DAME, CouleurCarte.CARREAU));
		paire.add(new Carte(Denomination.DAME, CouleurCarte.COEUR));
		paire.add(new Carte(Denomination.QUATRE, CouleurCarte.TREFLE));
		paire.add(new Carte(Denomination.DEUX, CouleurCarte.PIQUE));
		paire.add(new Carte(Denomination.DIX, CouleurCarte.CARREAU));

		Main deuxPaires = new Main();
		deuxPaires.add(new Carte(Denomination.DAME, CouleurCarte.TREFLE));
		deuxPaires.add(new Carte(Denomination.DAME, CouleurCarte.CARREAU));
		deuxPaires.add(new Carte(Denomination.ROI, CouleurCarte.PIQUE));
		deuxPaires.add(new Carte(Denomination.ROI, CouleurCarte.COEUR));
		deuxPaires.add(new Carte(Denomination.DIX, CouleurCarte.CARREAU));

		Main brelan = new Main();
		brelan.add(new Carte(Denomination.DAME, CouleurCarte.CARREAU));
		brelan.add(new Carte(Denomination.DAME, CouleurCarte.COEUR));
		brelan.add(new Carte(Denomination.DAME, CouleurCarte.PIQUE));
		brelan.add(new Carte(Denomination.TROIS, CouleurCarte.CARREAU));
		brelan.add(new Carte(Denomination.DIX, CouleurCarte.CARREAU));

		Main quinte = new Main();
		quinte.add(new Carte(Denomination.DAME, CouleurCarte.COEUR));
		quinte.add(new Carte(Denomination.VALET, CouleurCarte.TREFLE));
		quinte.add(new Carte(Denomination.ROI, CouleurCarte.PIQUE));
		quinte.add(new Carte(Denomination.AS, CouleurCarte.COEUR));
		quinte.add(new Carte(Denomination.DIX, CouleurCarte.CARREAU));

		Main couleur = new Main();
		couleur.add(new Carte(Denomination.DEUX, CouleurCarte.CARREAU));
		couleur.add(new Carte(Denomination.VALET, CouleurCarte.CARREAU));
		couleur.add(new Carte(Denomination.QUATRE, CouleurCarte.CARREAU));
		couleur.add(new Carte(Denomination.SEPT, CouleurCarte.CARREAU));
		couleur.add(new Carte(Denomination.DIX, CouleurCarte.CARREAU));

		Main mainPleine = new Main();
		mainPleine.add(new Carte(Denomination.DAME, CouleurCarte.COEUR));
		mainPleine.add(new Carte(Denomination.DAME, CouleurCarte.PIQUE));
		mainPleine.add(new Carte(Denomination.ROI, CouleurCarte.CARREAU));
		mainPleine.add(new Carte(Denomination.ROI, CouleurCarte.TREFLE));
		mainPleine.add(new Carte(Denomination.ROI, CouleurCarte.COEUR));

		Main carre = new Main();
		carre.add(new Carte(Denomination.DAME, CouleurCarte.COEUR));
		carre.add(new Carte(Denomination.DAME, CouleurCarte.PIQUE));
		carre.add(new Carte(Denomination.DAME, CouleurCarte.TREFLE));
		carre.add(new Carte(Denomination.DAME, CouleurCarte.CARREAU));
		carre.add(new Carte(Denomination.DIX, CouleurCarte.CARREAU));

		Main quinteCouleur = new Main();
		quinteCouleur.add(new Carte(Denomination.CINQ, CouleurCarte.CARREAU));
		quinteCouleur.add(new Carte(Denomination.QUATRE, CouleurCarte.CARREAU));
		quinteCouleur.add(new Carte(Denomination.TROIS, CouleurCarte.CARREAU));
		quinteCouleur.add(new Carte(Denomination.DEUX, CouleurCarte.CARREAU));
		quinteCouleur.add(new Carte(Denomination.SIX, CouleurCarte.CARREAU));

		Main quintuplet = new Main();
		quintuplet.add(new Carte(Denomination.DAME, CouleurCarte.COEUR));
		quintuplet.add(new Carte(Denomination.DAME, CouleurCarte.PIQUE));
		quintuplet.add(new Carte(Denomination.DAME, CouleurCarte.TREFLE));
		quintuplet.add(new Carte(Denomination.DAME, CouleurCarte.COEUR));
		quintuplet.add(new Carte(Denomination.DAME, CouleurCarte.CARREAU));

		Main quinteRoyale = new Main();
		quinteRoyale.add(new Carte(Denomination.DAME, CouleurCarte.CARREAU));
		quinteRoyale.add(new Carte(Denomination.VALET, CouleurCarte.CARREAU));
		quinteRoyale.add(new Carte(Denomination.ROI, CouleurCarte.CARREAU));
		quinteRoyale.add(new Carte(Denomination.AS, CouleurCarte.CARREAU));
		quinteRoyale.add(new Carte(Denomination.DIX, CouleurCarte.CARREAU));

		// TEST PAIRE EST PLUS PETIT QUE DEUX PAIRES
                RangPoker rp1 = new RangPoker(), rp2 = new RangPoker();
                System.out.println("Last error: ");
                rp1 = RangPoker.getRang(paire);
                rp2 = RangPoker.getRang(quinteRoyale);
		assertTrue(paire.compareTo(quinteRoyale) < 0);

		// TEST PAIRE DAME EST PLUS GRAND QUE PAIRE SEPT
		Main m = new Main();
		m.add(new Carte(Denomination.SEPT, CouleurCarte.COEUR));
		m.add(new Carte(Denomination.SEPT, CouleurCarte.CARREAU));
		m.add(new Carte(Denomination.DAME, CouleurCarte.PIQUE));
		m.add(new Carte(Denomination.DIX, CouleurCarte.TREFLE));
		m.add(new Carte(Denomination.TROIS, CouleurCarte.CARREAU));

		assertTrue(paire.compareTo(m) > 0);

		// TEST DEUX PAIRES DAME et ROI PLUS GRAND QUE DEUX PAIRES 2 et 3
		m = new Main();
		m.add(new Carte(Denomination.DEUX, CouleurCarte.COEUR));
		m.add(new Carte(Denomination.DEUX, CouleurCarte.CARREAU));
		m.add(new Carte(Denomination.TROIS, CouleurCarte.PIQUE));
		m.add(new Carte(Denomination.TROIS, CouleurCarte.TREFLE));
		m.add(new Carte(Denomination.SIX, CouleurCarte.CARREAU));

		assertTrue(deuxPaires.compareTo(m) > 0);
		
		// TEST MAIN PLEINE DAME DAME ROI ROI ROI PLUS GRAND QUE MAIN PLEINE DEUX DEUX TROIS TROIS TROIS
		m = new Main();
		m.add(new Carte(Denomination.DEUX, CouleurCarte.COEUR));
		m.add(new Carte(Denomination.TROIS, CouleurCarte.CARREAU));
		m.add(new Carte(Denomination.TROIS, CouleurCarte.PIQUE));
		m.add(new Carte(Denomination.TROIS, CouleurCarte.TREFLE));
		m.add(new Carte(Denomination.DEUX, CouleurCarte.CARREAU));

		assertTrue(mainPleine.compareTo(m) > 0);
		
		// TEST DEUX MAINS IDENTIQUES
		assertTrue(couleur.compareTo(couleur) == 0);
	}

	public void testEstValide() {
		Main m = new Main();
                assertFalse(m.estValide());
                m.add(new Carte(Denomination.DEUX, CouleurCarte.COEUR));                
                assertTrue(m.estValide());
	}

	public void testFirst() {
		Main m1 = new Main();
		m1.add(new Carte(Denomination.CINQ, CouleurCarte.CARREAU));
		m1.add(new Carte(Denomination.CINQ, CouleurCarte.COEUR));

		assertEquals(m1.iterator().next(), m1.first());
	}

	public void testGetCartes() {
		Main brelan = new Main();
		Carte c1 = new Carte(Denomination.DAME, CouleurCarte.CARREAU);
		Carte c2 = new Carte(Denomination.DAME, CouleurCarte.COEUR);
		Carte c3 = new Carte(Denomination.DAME, CouleurCarte.PIQUE);
		Carte c4 = new Carte(Denomination.TROIS, CouleurCarte.CARREAU);
		Carte c5 = new Carte(Denomination.DIX, CouleurCarte.CARREAU);
		brelan.add(c1);
		brelan.add(c2);
		brelan.add(c3);
		brelan.add(c4);
		brelan.add(c5);
		
		ArrayList<Carte> cartes = (ArrayList<Carte>) brelan.getCartes();
		assertEquals(c1, cartes.get(0));
		assertEquals(c2, cartes.get(1));
		assertEquals(c3, cartes.get(2));
		assertEquals(c4, cartes.get(3));
		assertEquals(c5, cartes.get(4));
	}

	public void testGetRangPoker() {
		Main m = new Main();
                RangPoker rp = new RangPoker();
                m.setRangPoker(rp);
                assertEquals(rp, m.getRangPoker());       
	}

	public void testIterator() {
		Main m = new Main();
                m.add(new Carte(Denomination.CINQ, CouleurCarte.COEUR));
                Iterator<Carte> it1 = m.iterator();
                
                assertEquals(m.getCartes().iterator().next(), it1.next());
	}

	public void testRemove() {
		Main m1 = new Main();
		Carte c = new Carte(Denomination.CINQ, CouleurCarte.CARREAU);
		m1.add(c);
		m1.add(new Carte(Denomination.CINQ, CouleurCarte.COEUR));
		m1.remove(c);

		assertEquals(1, m1.size());
	}

	public void testSize() {
		Main m1 = new Main();

		assertEquals(0, m1.size());
		m1.add(new Carte(Denomination.CINQ, CouleurCarte.CARREAU));
		assertEquals(1, m1.size());
		m1.add(new Carte(Denomination.CINQ, CouleurCarte.COEUR));
		assertEquals(2, m1.size());
		m1.add(new Carte(Denomination.DAME, CouleurCarte.CARREAU));
		assertEquals(3, m1.size());
		m1.add(new Carte(Denomination.DIX, CouleurCarte.TREFLE));
		assertEquals(4, m1.size());
		m1.add(new Carte(Denomination.SIX, CouleurCarte.CARREAU));
		assertEquals(5, m1.size());
	}

}
